package org.strieber.fca;

import java.util.ArrayList;
import java.util.TreeSet;

public class OriginalKevinSort {

		public static void main(String[] args) {
			new OriginalKevinSort();
		}

		ArrayList<String> input=new ArrayList<String>();
		ArrayList<ArrayList<TreeSet<String>>> rules=new ArrayList<ArrayList<TreeSet<String>>>();
		ArrayList<ArrayList<TreeSet<String>>> tempNewRules=new ArrayList<ArrayList<TreeSet<String>>>();
		
		public OriginalKevinSort() {
			this.popData2();
			this.popRules();
			//this.printData(rules);
			

			for (int a = 0; a < 3; a++) {
				
				System.out.println("before");
				this.printData(rules);
				this.makePass();
				this.rules.addAll(tempNewRules);
				System.out.println("after");
				this.printData(rules);
			}

			



			
		}
		
		public void makePass(){
			
			
			this.tempNewRules.clear();
			ArrayList<ArrayList<TreeSet<String>>> tempRules;
			
			if(rules.size()>0){
			//exclude
			eloop:
			//for(int e=rules.get(0).size()-1;  e>=0;e--){
				for(int e=0;rules.size()>0 &&  e<rules.get(0).size();e++){
					System.out.println("e "+e);
			iloop:
			for(int i=0;i<rules.size();i++){
				tempRules=new ArrayList<ArrayList<TreeSet<String>>>();

				jloop:
				for(int j=0;j<rules.size();j++){
					if(i==j) continue;
					System.out.println("i"+i+"  j "+j);
						// comparing treesets
						kloop:
						for(int k=0;k<rules.get(i).size();k++){
							if(e==k){						
							//	continue;
							}
							if(e!=k && !rules.get(j).get(k)
									.equals(rules.get(i).get(k))){
								System.out.println("breaking k:"+k);
								break kloop;
							}
							if(k==rules.get(j).size()-1){
								System.out.println("adding to temp:: "+rules.get(j));
								tempRules.add(rules.get(j));
								rules.remove(j);
								j--;
								//continue jloop;
							}
						
					}
				}// end of j
				if(tempRules.size()>0){

					tempRules.add(rules.get(i));
					System.out.println("entered : temprules");
					this.printData(tempRules);
					rules.remove(i);
					i--;
					// combine possible var values in tempRules
					for(int m=0;m<tempRules.size();m++){
						for(int p=0;p<tempRules.get(m).size();p++){
								tempRules.get(0).get(p).addAll(tempRules.get(m).get(p));
					}
					}
					// add combined rules back to rules
					tempNewRules.add(tempRules.get(0));
					//break iloop;
				}
				}// end of i
			}// end of e
		}
		}
		
		
		public void popRules(){
			for(int i=0;i<input.size();i++){
				rules.add(new ArrayList<TreeSet<String>>());
				String in= input.get(i);
				String sary1[]=in.split("∧");
				
				for(int j=0;j<sary1.length;j++){
					rules.get(i).add(new TreeSet<String>());
					String vstr=sary1[j].split("=")[1].split(" ")[0];
					rules.get(i).get(j).add(vstr);	
				}		
			}
		}
		
		
		public void printData(ArrayList<ArrayList<TreeSet<String>>> r){
			System.out.println("printing rules:");
			for(ArrayList<TreeSet<String>> rule:r){
				System.out.println(rule);
			}
			System.out.println("");
		}
		
		
		public void popData(){

			input.add("( A=3 ∧ B=2 ∧ C=1 ) -> 1");
			input.add("( A=2 ∧ B=2 ∧ C=1 ) -> 1");
			input.add("( A=1 ∧ B=2 ∧ C=2 ) -> 1");
			input.add("( A=3 ∧ B=2 ∧ C=2 ) -> 1");
			input.add("( A=2 ∧ B=2 ∧ C=2 ) -> 1");
			input.add("( A=3 ∧ B=3 ∧ C=1 ) -> 1");
			input.add("( A=2 ∧ B=3 ∧ C=1 ) -> 1");
			input.add("( A=1 ∧ B=3 ∧ C=1 ) -> 1");
			input.add("( A=3 ∧ B=3 ∧ C=2 ) -> 1");
			input.add("( A=2 ∧ B=3 ∧ C=2 ) -> 1");
			input.add("( A=1 ∧ B=3 ∧ C=2 ) -> 1");
			
		}
		
		
		public void popData2(){

			input.add("( A=1 ∧ B=2 ∧ C=1 ) -> 1");
			input.add("( A=2 ∧ B=2 ∧ C=1 ) -> 1");
			input.add("( A=3 ∧ B=2 ∧ C=1 ) -> 1");
			
			input.add("( A=1 ∧ B=2 ∧ C=2 ) -> 1");
			input.add("( A=3 ∧ B=2 ∧ C=2 ) -> 1");
			input.add("( A=2 ∧ B=2 ∧ C=2 ) -> 1");
			
			input.add("( A=3 ∧ B=3 ∧ C=1 ) -> 1");
			input.add("( A=2 ∧ B=3 ∧ C=1 ) -> 1");
			input.add("( A=1 ∧ B=3 ∧ C=1 ) -> 1");
			
			input.add("( A=3 ∧ B=3 ∧ C=2 ) -> 1");
			input.add("( A=2 ∧ B=3 ∧ C=2 ) -> 1");
			input.add("( A=1 ∧ B=3 ∧ C=2 ) -> 1");
			
		}
		
		
	}

